import javax.swing.*;
import java.awt.*;

public class SpringLayoutTest extends JFrame {
    //设置Jpane的布局管理器为SpringLayout;
    SpringLayout springLayout = new SpringLayout();
    JPanel jPanel = new JPanel(springLayout);
    //创建组件
    JLabel titleLabel = new JLabel("文章标题:");
    JTextField titleText = new JTextField() ;
    JLabel authorLabel = new JLabel("作者:");
    JTextField authorText = new JTextField();
    JLabel contLabel = new JLabel("请输入内容:" );
    JTextArea contArea = new JTextArea(10,20);

    public SpringLayoutTest(){
          super("弹簧布局");
        Container contentPane = getContentPane();
         titleText.setPreferredSize(new Dimension(200,30));
         authorText.setPreferredSize(new Dimension(200,30));

        //把组件加入到JPanel
        jPanel.add(titleLabel);
        jPanel.add(titleText);
         jPanel.add(authorLabel);
         jPanel.add(authorText);
         jPanel.add(contLabel);
         jPanel.add(contArea);
         //设置jPanel容器的背景颜色
         jPanel.setBackground(Color.cyan);
        //SpringLayout : 布局管理器
        //SpringLayout.Constraints  : 使用弹簧布局的容器里的组件的布局约束 （每个组件对应一个约束）;
        //Spring  :  可以进行加减乘除的四则运算的整数 ；

        /*
        方法1
        直接设置标题偏移位置 ；
         */

        //通过布局管理器获取titleLabel 的布局约束
        SpringLayout.Constraints titleLabelCon = springLayout.getConstraints(titleLabel);
        //通过布局约束 ，设置 titleLabel 的x轴和y轴的偏移量
        //setX的参数需要Spring类型 ， 使用constant方法 来获取
    //    titleLabelCon.setX(Spring.constant(100));    //x轴偏移100
        titleLabelCon.setY(Spring.constant(50));    //y轴偏移 50

        /*
        方法2
        使用方法计算 ，使用偏移量来，让标题在窗体水平居中的位置，；
         */

        //设置 titleLabel和titleText在水平居中的位置；
        // 获取titleLabel 和 titleText 的 width ， 然后width / 2 得到 偏移量 ，
        // 把偏移量在窗体的中心点 向-x方向偏移就可以让其在水平居中的位置 ；
        Spring titleLabelWidth = Spring.width(titleLabel);
        Spring titleTextWidth = Spring.width(titleText);
        Spring spaceWidth = Spring.constant(20);
        //计算 titleLabel和titleText 的width加上中间的20 ，在除以2 ；
        Spring childWidth = Spring.sum(Spring.sum(titleLabelWidth, titleTextWidth), spaceWidth);
         //获得 childWidth 除以2的数
        int offsetX = childWidth.getValue()/2;
        //设置 titleLabel 的约束 ；
        // titleLabel的west ,在 jPanel 容器的 水平居中 的 -offsetX 位置 ；SpringLayout.HORIZONTAL_CENTER  水平居中位置
        springLayout.putConstraint(SpringLayout.WEST,titleLabel ,
                -offsetX,SpringLayout.HORIZONTAL_CENTER , jPanel );



         /*
         设置约束的第一中方法 ，比较复杂
          */

        //设置标题文本框 ，按标题的偏移量计算 ，titleText的西边在 titleLabel的东边20px ,北边一样 ； ，
        SpringLayout.Constraints titleTextCon = springLayout.getConstraints(titleText);
        //通过标题来给标题文本框设置约束 ，用setConstraint 方法设置约束 ；

        //获取 titleLabel的 东边的值 用getConstrain
        Spring titleLabelEast = titleLabelCon.getConstraint(SpringLayout.EAST);
        // setConstraint 参数 1 ： 东西南北 ， 参数2 ： 就是值 （偏移东西南北那边多少）
        //  Spring 不能和 数字直接相加 ， 使用Spring.sum方法（实现相加）
        titleTextCon.setConstraint(SpringLayout.WEST , Spring.sum(titleLabelEast,Spring.constant(20)));
        //titleText  和 titleLabel 的北边相同 ，直接获取 titleLabel的北边值 放进去;
        titleTextCon.setConstraint(SpringLayout.NORTH , titleLabelCon.getConstraint(SpringLayout.NORTH));

        /*
           设置约束的第二种方法 , springLayout.putConstraint();;
            e1:要设置组件的哪个边界（edgeName东西南北）
            c1：要设置的组件
            pad：距离值
            e2：参照组件的边界 ；
            c2：参照物（组件）
         */
        //设置authorLabel 的约束 ， 使得authorLabel的East 和 titleLabel的East 一样
         springLayout.putConstraint(SpringLayout.EAST , authorLabel ,0 , SpringLayout.EAST,titleLabel);
          //设置authorLabel的北边距离 titleLabel的南边20px
          springLayout.putConstraint(SpringLayout.NORTH,authorLabel,20,SpringLayout.SOUTH,titleLabel);

          //设置authorText的约束 ， authorText 的西边 是 authorLabel的东边 20 ， 北边一样；
          springLayout.putConstraint(SpringLayout.WEST , authorText,20,SpringLayout.EAST,authorLabel);
           springLayout.putConstraint(SpringLayout.NORTH, authorText,0,SpringLayout.NORTH,authorLabel);

           //设置contLabel
        springLayout.putConstraint(SpringLayout.NORTH , contLabel,20,SpringLayout.SOUTH,authorLabel);
        springLayout.putConstraint(SpringLayout.EAST, contLabel,0,SpringLayout.EAST,authorLabel);
        // 设置contArea
        springLayout.putConstraint(SpringLayout.WEST , contArea,20,SpringLayout.EAST,contLabel);
        springLayout.putConstraint(SpringLayout.NORTH, contArea,0,SpringLayout.NORTH,contLabel);

        //设置contArea 随着窗体的变化而变化 ；
        //设置contArea 的东边和南边 参照jPanel
        springLayout.putConstraint(SpringLayout.SOUTH , contArea,-20 , SpringLayout.SOUTH ,jPanel);
        springLayout.putConstraint(SpringLayout.EAST , contArea , -20 , SpringLayout.EAST , jPanel);


        contentPane.add(jPanel);
        //设置大小
        setSize(600,400);
        //居中
        //传一个null居中
        setLocationRelativeTo(null);
        //退出时退出窗口
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //窗口可见
        setVisible(true);

    }

    public static void main(String[] args) {
        SpringLayoutTest springLayoutTest = new SpringLayoutTest();
    }
}
